/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: Frank
 * 系统版本: 1.0.0
 * 开发人员: Frank
 * 开发时间: 2019/9/23 15:37
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.spring.arch.message.common.sender;

import com.spring.arch.message.dto.MessageSenderRequest;
import com.spring.arch.message.dto.MessageSenderResponse;
import com.spring.arch.message.dto.MessageSenderRequest;
import com.spring.arch.message.dto.MessageSenderResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * 抽象发送器
 * @author Frank
 * @version 1.0.0.1
 * @since JDK 1.8
 */
@Slf4j
public abstract class AbstractSender implements Sender {

    /**
     * 校验参数
     * @param req 请求
     * @return 响应
     */
    @Override
    public MessageSenderResponse send(MessageSenderRequest req) {
        // 检验参数
        MessageSenderResponse resp = check(req);
        if (!resp.isSuccess()) {
            log.warn("消息发送|参数校验失败，req={}，resp={}", req, resp);
            return resp;
        }
        // 执行发送
        resp = toSend(req);
        if (!resp.isSuccess()) {
            log.warn("消息发送|发送消息失败，req={}，resp={}", req, resp);
        }
        return resp;
    }

    /**
     * 检查参数
     * @param req 请求信息
     * @return 响应信息
     */
    private MessageSenderResponse check(MessageSenderRequest req) {
        // 通用校验
        if (StringUtils.isBlank(req.getMobile())) {
            return MessageSenderResponse.failure("接收用户手机号为空");
        }
        if (req.getBusinessType() == null) {
            return MessageSenderResponse.failure("业务类型为空");
        }
        // 自检
        MessageSenderResponse resp = checkSelf(req);
        if (!resp.isSuccess()) {
            return MessageSenderResponse.failure(resp.getMsg());
        }
        return resp;
    }

    /**
     * 校验参数
     * @param req 请求
     * @return 响应
     */
    protected abstract MessageSenderResponse checkSelf(MessageSenderRequest req);

    /**
     * 发送请求
     * @param req 请求
     * @return 响应
     */
    protected abstract MessageSenderResponse toSend(MessageSenderRequest req);

}
